用动态规划解决TSP问题

状态压缩DP

include"stdio.h"
#include"stdlib.h"
#define MIN(a,b) (a<b)?a:b
int main(int argc,char* argv[]){
   freopen(argv[1],"r",stdin);
   const int SIZE=10; 
   double array[SIZE][SIZE];
   double dp[SIZE][1<<SIZE];
   int n;
   scanf("%d",&n);
   for(int i=0;i<n;++i)
      for(int j=0;j<n;++j)
          scanf("%lf",&array[i][j]);
   for(int j=1;j<n;++j)
      dp[j][0]=array[j][0];
   int upperBound=1<<(n-1);
   for(int i=1;i<upperBound;++i){
      for(int j=0;j<n;++j){
         if(j!=0 &&(i&(1<<(j-1)))) continue;//illegal condition
         for(int k=1;k<n;++k){
            if(j==k) continue;
            if( i&(1<<(k-1)) ){
               if(dp[j][i]==0)
                  dp[j][i]=array[j][k]+dp[k][i-(1<<(k-1))];
               else
                  dp[j][i]=MIN(dp[j][i],array[j][k]+dp[k][i-(1<<(k-1))]);
            }
         }
      }
   }
   printf("%lf\n",dp[0][upperBound-1]);
   return 0;
}                                                                                        
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值